﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Rarous.TexyNet;
using System.Globalization;

namespace Rarous.Gryphoon.Text {
  /// <summary>
  /// Třída pro práci s textem.
  /// </summary>
  public class TextUtility {
    public const string UrlWordsSeparator = "-";

    private ArticleTexy articleTexy;
    private CommentTexy commentTexy;

 

    /// <summary>
    /// Odstraní diakritiku z řetězce.
    /// </summary>
    /// <param name="s">Vstupní řetězec.</param>
    /// <returns></returns>
    public string RemoveDiacritics(string s) {
      if (string.IsNullOrEmpty(s)) {
        return s;
      }
      s = s.Normalize(NormalizationForm.FormD);
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < s.Length; i++) {
        if (CharUnicodeInfo.GetUnicodeCategory(s[i]) != UnicodeCategory.NonSpacingMark) {
          sb.Append(s[i]);
        }
      }
      return sb.ToString();
    }

    /// <summary>
    /// Převede text na formu pěkného URL.
    /// </summary>
    /// <param name="s">Vstupní text.</param>
    /// <param name="wordsSeparator">Znak oddělovače slov.</param>
    /// <returns></returns>
    public string CreateUrl(string s, string wordsSeparator) {
      if (String.IsNullOrEmpty(s)) {
        return String.Empty;
      }
      if (String.IsNullOrEmpty(wordsSeparator)) {
        return CreateUrl(s);
      }

      // normalizace rozlozi znaky s diakritikou na dva samostatne
      s = s.ToLower().Normalize(NormalizationForm.FormD);

      StringBuilder sb = new StringBuilder(s.Length);
      bool prevReplaced = false;
      foreach (char c in s) {
        UnicodeCategory category = CharUnicodeInfo.GetUnicodeCategory(c);
        // ponechame jen pismena bez diakritiky a cislice
        if ((category == UnicodeCategory.LowercaseLetter) 
            || (category == UnicodeCategory.DecimalDigitNumber)) {
          sb.Append(c);
          prevReplaced = false;
        }
        // mezery nahradime oddelovacem
        else if (((c == '-') || (category == UnicodeCategory.SpaceSeparator)) && (prevReplaced == false)) {
          sb.Append(wordsSeparator);
          prevReplaced = true; // pojistka, aby nevznikaly skupiny podtrzitek
        }
      }
      return sb.ToString();
    }

    /// <summary>
    /// Převede text na formu pěkného URL. Jako oddělovač slov je použit znak '-'.
    /// </summary>
    /// <param name="s">Vstupní text.</param>
    public string CreateUrl(string s) {
      return CreateUrl(s, UrlWordsSeparator);
    }

    /// <summary>
    /// Převede vstupní text na HTML.
    /// </summary>
    /// <param name="article">Vstupní text.</param>
    /// <returns></returns>
    public void ParseArticle(Article article) {
      articleTexy.Process(article);
    }

    /// <summary>
    /// Převede vstupní text komentáře na HTML.
    /// </summary>
    /// <param name="comment"></param>
    /// <returns></returns>
    public void ParseComment(Comment comment) {
      commentTexy.Process(comment);
    }
  }
}
